home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / compiler / visitor.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  4KB  |  128 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. from compiler import ast
  5.  
  6. class ASTVisitor:
  7.     """Performs a depth-first walk of the AST
  8.  
  9.     The ASTVisitor will walk the AST, performing either a preorder or
  10.     postorder traversal depending on which method is called.
  11.  
  12.     methods:
  13.     preorder(tree, visitor)
  14.     postorder(tree, visitor)
  15.         tree: an instance of ast.Node
  16.         visitor: an instance with visitXXX methods
  17.  
  18.     The ASTVisitor is responsible for walking over the tree in the
  19.     correct order.  For each node, it checks the visitor argument for
  20.     a method named 'visitNodeType' where NodeType is the name of the
  21.     node's class, e.g. Class.  If the method exists, it is called
  22.     with the node as its sole argument.
  23.  
  24.     The visitor method for a particular node type can control how
  25.     child nodes are visited during a preorder walk.  (It can't control
  26.     the order during a postorder walk, because it is called _after_
  27.     the walk has occurred.)  The ASTVisitor modifies the visitor
  28.     argument by adding a visit method to the visitor; this method can
  29.     be used to visit a child node of arbitrary type.
  30.     """
  31.     VERBOSE = 0
  32.     
  33.     def __init__(self):
  34.         self.node = None
  35.         self._cache = { }
  36.  
  37.     
  38.     def default(self, node, *args):
  39.         for child in node.getChildNodes():
  40.             self.dispatch(child, *args)
  41.         
  42.  
  43.     
  44.     def dispatch(self, node, *args):
  45.         self.node = node
  46.         klass = node.__class__
  47.         meth = self._cache.get(klass, None)
  48.         if meth is None:
  49.             className = klass.__name__
  50.             meth = getattr(self.visitor, 'visit' + className, self.default)
  51.             self._cache[klass] = meth
  52.         
  53.         return meth(node, *args)
  54.  
  55.     
  56.     def preorder(self, tree, visitor, *args):
  57.         '''Do preorder walk of tree using visitor'''
  58.         self.visitor = visitor
  59.         visitor.visit = self.dispatch
  60.         self.dispatch(tree, *args)
  61.  
  62.  
  63.  
  64. class ExampleASTVisitor(ASTVisitor):
  65.     """Prints examples of the nodes that aren't visited
  66.  
  67.     This visitor-driver is only useful for development, when it's
  68.     helpful to develop a visitor incrementally, and get feedback on what
  69.     you still have to do.
  70.     """
  71.     examples = { }
  72.     
  73.     def dispatch(self, node, *args):
  74.         self.node = node
  75.         meth = self._cache.get(node.__class__, None)
  76.         className = node.__class__.__name__
  77.         if meth is None:
  78.             meth = getattr(self.visitor, 'visit' + className, 0)
  79.             self._cache[node.__class__] = meth
  80.         
  81.         if self.VERBOSE > 1:
  82.             print 'dispatch', className,
  83.             if not meth or meth.__name__:
  84.                 pass
  85.             print ''
  86.         
  87.         if meth:
  88.             meth(node, *args)
  89.         elif self.VERBOSE > 0:
  90.             klass = node.__class__
  91.             if not self.examples.has_key(klass):
  92.                 self.examples[klass] = klass
  93.                 print 
  94.                 print self.visitor
  95.                 print klass
  96.                 for attr in dir(node):
  97.                     if attr[0] != '_':
  98.                         print '\t', '%-12.12s' % attr, getattr(node, attr)
  99.                         continue
  100.                 
  101.                 print 
  102.             
  103.             return self.default(node, *args)
  104.         
  105.  
  106.  
  107. _walker = ASTVisitor
  108.  
  109. def walk(tree, visitor, walker = None, verbose = None):
  110.     if walker is None:
  111.         walker = _walker()
  112.     
  113.     if verbose is not None:
  114.         walker.VERBOSE = verbose
  115.     
  116.     walker.preorder(tree, visitor)
  117.     return walker.visitor
  118.  
  119.  
  120. def dumpNode(node):
  121.     print node.__class__
  122.     for attr in dir(node):
  123.         if attr[0] != '_':
  124.             print '\t', '%-10.10s' % attr, getattr(node, attr)
  125.             continue
  126.     
  127.  
  128.